<!--
 * @Description: 
 * @Author: xiongkuobiao
 * @Date: 2023-02-13 09:22:55
 * @LastEditors: xiongkuobiao
 * @LastEditTime: 2023-12-25 15:52:16
-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body></body>
<script>d
    let obj = {
        a: "str",
        b: 123,
        c: function demo() {
            console.log(111);
        },
        d: null,
        date: new Date(),
        RegExp: new RegExp(/7/),
        e: new Set([1, 2, 3]),
        f: new Map([
            ["d", 9],
            ["e", 10],
        ]),
        Array: [1, 2, 3, 4],
        Object: { name: 111, age: { log: "2222" } },
        ArrayObject: [{ age: 1111 }],
    };

    function deepClone(obj, hash = new WeakMap) {
        // 函数 正则 日期 数字 字符串 null undefined Symbol BigInt 对象 数组
        if (obj instanceof RegExp) {
            return new RegExp(obj)
        }
        if (obj instanceof Date) {
            return new Date(obj)
        }
        if (typeof obj !== 'object' || obj === null) {
            return obj
        }
        if (hash.has(obj)) {
            return hash.get(obj)
        }
        let newObj = new obj.constructor()
        hash.set(obj, newObj)
        for (let key in obj) {
            if (obj.hasOwnProperty) {
                newObj[key] = deepClone(obj[key], hash)
            }
        }
        return newObj
    }

    let new1 = deepClone(obj)


    obj.b = 111111111111111
    console.log(obj, new1);

    //   // 处理null或者undefined
    //   if (obj === null) return obj;
    //     // 处理日期类型
    //     if (obj instanceof Date) return new Date(obj);
    //     // 处理正则类型
    //     if (obj instanceof RegExp) return new RegExp(obj);
    //     // 普通值或函数不需要深拷贝
    //     if (typeof obj !== "object") return obj;
    //     // 对象进行深拷贝
    //     if (hash.has(obj)) return hash.get(obj);
    //     let cloneObj = new obj.constructor();
    //     // 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
    //     hash.set(obj, cloneObj);
    //     for (let key in obj) {
    //         if (obj.hasOwnProperty(key)) {
    //             // 实现一个递归拷贝
    //             cloneObj[key] = deepClone(obj[key], hash);
    //         }
    //     }
    //     return cloneObj;
</script>

</html>